/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao.impl;

import dao.FilmeDAO;
import dao.Conexao;
import dao.LocadoraDAOException;
import model.Filme;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**  
 * Implementação da interface FilmeDAO
 * @author edward-arn
 */
public class FilmeDAOImpl implements FilmeDAO{
    
    private Connection conn;
    
    /*
     * Realiza a conexão com o BD 
     */
    public FilmeDAOImpl() throws LocadoraDAOException{
        try{
            this.conn= Conexao.getConnection();
        }catch(Exception e){
            throw new LocadoraDAOException("Erro: " + ":\n" + e.getMessage());
        }
    }
    
    /*
     * Método Atualiza Filme - que atualiza a tabela filme no BD
     * @param filme
     */
     public void atualizaFilme(Filme filme) throws LocadoraDAOException{
        PreparedStatement ps= null;
        Connection conn1= null;

        if(filme == null){
            throw new LocadoraDAOException("Nenhum filme foi informado!");
        }try{
            String sql= "UPDATE filme SET categoria=?, duracao=?, tipo=? WHERE nome=?";

            conn1= this.conn;
            ps= conn1.prepareStatement(sql);
            ps.setString(1, filme.getCategoria());
            ps.setString(2, filme.getDuracao());
            ps.setString(3, filme.getTipo());
            ps.setString(4, filme.getNome());
            ps.executeUpdate();
        }catch (SQLException e){
            throw new LocadoraDAOException("Erro ao atualizar filme" + e);
        }finally{
            Conexao.closeConnection(conn1, ps);
        }
    }
    /*
     * Método Cadastra Filme - que escreve os dados do filme no BD
     * @param filme
     */
     
     public void cadastraFilme(Filme filme) throws LocadoraDAOException{
        PreparedStatement ps= null;
        Connection conn1= null;

        if(filme == null){
            throw new LocadoraDAOException("Nenhum filme foi informado!");
        }try{
            String sql= "INSERT INTO filme(nome, categoria, duracao, tipo) VALUES (?, ?, ?, ?)";

            conn1= this.conn;
            ps= conn1.prepareStatement(sql);
            ps.setString(1, filme.getNome());
            ps.setString(2, filme.getCategoria());
            ps.setString(3, filme.getDuracao());
            ps.setString(4, filme.getTipo());
            ps.executeUpdate();
        }catch (SQLException e){
            throw new LocadoraDAOException("Erro ao salva filme" + e);
        }finally{
            Conexao.closeConnection(conn1, ps);
        }
    }
     
    /*
     * Método Exclui Filme - que deleta os dados do filme no BD
     * @param filme
     */
     
     public void excluiFilme(Filme filme) throws LocadoraDAOException{
        PreparedStatement ps= null;
        Connection conn1= null;

        if(filme == null){
            throw new LocadoraDAOException("Nenhum filme foi informado!");
        }
        try{
            String sql= "DELETE FROM filme WHERE nome=?";
            conn1= this.conn;
            ps= conn1.prepareStatement(sql);
            ps.setString(1, filme.getNome());
            ps.executeUpdate();
        }catch (SQLException e){
            throw new LocadoraDAOException("Erro ao excluir filme" + e);
        }finally{
            Conexao.closeConnection(conn1, ps);
        }
    }
     
    /*
     * Método Lista Filmes - que retorna os dados da tabela filme no BD
     * @param filme
     * @return listFilmes
     */
     
      public List listaFilmes() throws LocadoraDAOException{
        PreparedStatement ps= null;
        Connection conn1= null;
        ResultSet rs= null;

        try{
            String sql= "Select * FROM filme";
            conn1= this.conn;
            ps= conn1.prepareStatement(sql);
            rs= ps.executeQuery();
            List<Filme> listFilmes = new ArrayList<Filme>();
            while(rs.next()){
                String nome= rs.getString("nome");
                String categoria= rs.getString("categoria");
                String duracao= rs.getString("duracao");
                String tipo= rs.getString("tipo");
                listFilmes.add(new Filme(nome, categoria, duracao, tipo));
            }return listFilmes;
        }catch(SQLException e){
            throw new LocadoraDAOException("Erro ao listar os filmes" + e);
        }finally{
            Conexao.closeConnection(conn1, ps, rs);
        }
    }
      
    /*
     * Método Busca - que retorna um conjunto de dados no BD
     * @param filme
     * @return filme
     */
      
      public Filme buscaFilme(String nome) throws LocadoraDAOException{
        PreparedStatement ps= null;
        Connection conn1= null;
        ResultSet rs= null;
        try{
            String sql="SELECT * FROM filme WHERE nome=?";
            conn1= this.conn;
            ps= conn1.prepareStatement(sql);
            ps.setString(1, nome);
            rs= ps.executeQuery();
            Filme filme;

            if( !rs.next()){
                filme = new Filme("null", "", "", ""); //*****************************
            }else{
                nome= rs.getString("nome");
                String categoria= rs.getString("categoria");
                String duracao= rs.getString("duracao");
                String tipo= rs.getString("tipo");
                filme = new Filme(nome, categoria, duracao, tipo);
            }return filme;
        }catch (SQLException e){
            throw new LocadoraDAOException("Erro ao procurar filme" + e);
        }finally{
            Conexao.closeConnection(conn1, ps,rs);
        }
    }
    
}
